'use strict'
process.chdir(__dirname)
const titbit = require('titbit')
const fs = require('fs')
const pg = require('pg')
const dbconfig = require('./dbconfig.js')
const wxkey = require('./wxkey.js')

const tbloader = require('titbit-loader')

//使用HTTP/1.1的客户端
const {httpcli} = require('gohttp')
const token = require('titbit-token')

let tok = new token({
    //token有效期，单位是秒
    expires:3600,
    //必须是32位字母数字
    key:'dljsygchshddsdszsmcsbcfmqfxshbyq',
    //必须是16位字母数字
    iv:'ryzxrcqzxhclrcql'
})

//初始化数据库连接
let psql = new pg.Pool(dbconfig)

try{
    fs.accessSync('./images')
}catch(e){
    fs.mkdirSync('./images')
}

let cert_path = '/usr/local/share'

const app = new titbit({
    // 开启调试模式，会输出错误信息
    debug: true,
    globalLog: true,
    cert:`${cert_path}/apiwec.wzryrjxy.xyz.pem`,
    key:`${cert_path}/apiwec.wzryrjxy.xyz.key`
})

let tb = new tbloader();
tb.init(app);

//就是在app.service对象上添加了一个属性
app.addService('tok', tok);
app.addService('psql', psql);

app.addService('imagePath',`${__dirname}/images`)


/* ------content 路由--------- */

// app.get('/content', async c => {
//     let sqltest = 'SELECT id,title,update_time FROM content'
//     let r = await psql.query(sqltest)

//     c.send(r.rows)
// })

// app.post('/content', async c => {
//     try{
//         //c.body是提交的请求体数据
//         let data = JSON.parse(c.body)
//         let sqltest = 'INSERT INTO content'
//             +'(id, detail, title, add_time, update_time)'
//             +'VALUES($1,$2,$3,$4,$5)'

//         //随机数转成16进制字符串并去掉前两位，字串作为ID
//         let id = Math.random().toString(16).substring(2)
//         let tm = Date.now()

//         let r = await psql.query(sqltest,[
//             id, data.detail, data.title, tm, tm
//         ])

//         if(r.rowCount === 0){
//             return c.status(500).send('faild')
//         }

//         c.send(id)
//     }catch(err){
//         console.error(err)
//         c.status(400).send('bad data')
//     }
// })

// app.get('/content/:id', async c => {
//     let id = c.param.id

//     let sqltest = 'SELECT id, detail, title, update_time'
//         +'FROM content WHERE id = $1';

//     let r = await psql.query(sqltest,[ id ])
    
//     if(r.rowCount === 0)
//         return c.status(404).send('not found')

//     c.send(r.rows[0])
// })

// app.delete('/content/:id',async c =>{
//     let r = await psql.query(`DELETE FROM content WHERE id=$1`,
//     [c.param.id]
//     )

//     c.send({
//         count: r.rowCount
//     })
// })


/* ------content 路由 end */

// c就是context
app.get('/',async c=>{
    c.send('ok')
})

app.get('/upload',async c=>{
    // c.helper是助手函数模块 其中有对stream.pipe的封装
    // c.reply是响应对象，http/1.1中指向response，http/2中指向stream
    await c.helper.pipe('./upload.html',c.reply)
})

// JS无需加； 括号开头需要
// ;(async ()=>{

// })

// app.post('/upload',async c=>{
//     let f = c.getFile('file')

//     if(!f){
//         return c.status(400).send('file not found')
//     }

//     // 生成唯一文件名
//     let fname = c.helper.makeName(f.filename)
//     try{
//         await c.moveFile(f,`./images/${fname}`)
//         c.send(fname)
//     }catch(e){
//         c.status(500).send('failed')
//     }
    

// })

// :开头表示这个路由是带参数的路由   动态路由（让她以某种模式出现） 例/image/a.jpg  属于：name
// app.get('/image/:name',async c=>{
//     let imgname = c.param.name
    
//     try{
//         await c.helper.pipe(`./images/${imgname}`,c.reply)
//     }catch(err){
//         c.status(404).send('image not found')
//     }
// })

app.get('/user/:name/:age/:mobile',async c=>{
    console.log(c.param)
    c.send(c.param)
})

app.get('/mp-login/:code', async c => {
    c.send(c.param)
    let auth_url = `https://api.weixin.qq.com/sns/jscode2session`
    +`?appid=${wxkey.appid}`
    +`&secret=${wxkey.secret}`
    +`&js_code=${c.param.code}`
    +`&grant_type=authorization_code`

    let ret = await httpcli.get(auth_url)
                            .then(res=>{
                            return res.json()
                            })

    c.send( tok.make(ret) )
})

// 监听1234端口运行服务
app.run(2001);
